﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GmFamilyService.h"
#include "ElementCreationOptions.h"
#include "IFamilyEntity.h"
#include "RichTextAlignmentType.h"
#include "RichTextAnchorPointType.h"

namespace gcmp
{
    class IVisibilityTypeFlags;
    enum class GraphicsMaterialDisplayStyle;
}


namespace gfam
{

    enum class TextFitType;

    /// \brief 模型文字接口类
    class GM_FAMILY_SERVICE_EXPORT IFamilyModelText : public IFamilyEntity
    {
        DEFINE_CAST_DERIVED(gfam::IFamilyModelText, gfam::IFamilyEntity)
    public:
        enum class AnchorType : Int32
        {
            PlaneXY = 0,
            PlaneZX = 1,
            PlaneYZ = 2
        };

        /// \brief 获取定位点图形节点Id
        ///
        /// \param  type 类型
        /// \return Int32 相应的图形节点Id
        virtual Int32 GetAnchorId(AnchorType type) const = 0;
        
        /// \brief 获取是否使用样式管理器中样式
        ///
        virtual bool IsUseSystemStyle() const = 0;

        /// \brief 获取厚度
        ///
        /// \param  type 类型
        /// \return Int32 相应的图形节点Id
        virtual double GetThickness() const = 0;

        /// \brief 设置厚度
        ///
        /// \param  thickness 厚度值
        virtual void SetThickness(double thickness) = 0;

        /// \brief 设置文字样式
        ///
        /// \param  textStyleId 文字样式Id
        virtual  bool SetTextStyleId(gcmp::ElementId textStyleId) = 0;

        /// \brief 获取文字样式
        ///
        /// \return  文字样式Id
        virtual gcmp::ElementId GetTextStyleId() const = 0;


        /// \brief 获取文本区域宽度
        ///
        /// 仅供RichText使用
        /// \return 返回文本区域宽度
        virtual double GetTextAreaWidth() const = 0;

        /// \brief 获取文本区域高度
        ///
        /// 仅供RichText使用
        /// \return 返回文本区域高度
        virtual double GetTextAreaHeight() const = 0;


        /// \brief 设置文字对象字符高度
        ///
        /// 当调用对象为RichText文字，若在SetAcadStyleString之前调用该接口，则设置的是缺省的高度；
        /// 若在SetAcadStyleString之后调用该接口，则会重置整个文字的高度。
        /// \param charHeight 文字对象字符高度,charHeight应为大于0的值
        virtual bool SetCharHeight(double charHeight) = 0;

        /// \brief 获取文字对象字符高度
        ///
        /// 当调用对象为RichText文字,获取的是缺省的字符高度
        /// \return 文字对象字符高度
        virtual double GetCharHeight() const = 0;


        /// \brief 获取定位点是否显示的状态
        ///
        /// \return true 表示定位点显示, false 表示定位点隐藏
        virtual bool IsAnchorPointVisible() const = 0;

        /// \brief 设置定位点是否显示
        ///
        /// \param value 显示状态，true 显示，fasle隐藏
        virtual void SetAnchorPointVisible(bool value) = 0;

        /// \brief 设置定位点的世界坐标
        ///
        /// \param position 定位点的世界坐标
        /// \return true表示设置成功，否则设置失败
        virtual bool SetAnchorPointPosition(const gcmp::Vector3d& position) = 0;

        /// \brief 获取定位点的世界坐标
        ///
        /// \return 返回定位点的世界坐标
        virtual gcmp::Vector3d GetAnchorPointPosition() const = 0;


        /// \brief 根据定位点类型获取定位点世界坐标
        ///
        /// \param horizontalAnchorPointType 水平定位类型
        /// \param verticalAnchorPointType 垂直定位类型
        /// \return 返回坐标
        virtual gcmp::Vector3d GetPositionByAnchorPointType(gcmp::HorizontalAnchorPointType horizontalAnchorPointType, gcmp::VerticalAnchorPointType verticalAnchorPointType) const = 0;



        /// \brief 获取字符的宽度因子
        ///
        /// 当调用对象为RichText文字,获取的是缺省的字符高度
        /// \return 字符的宽度因子
        virtual double GetWidthFactor() const = 0;

        /// \brief 设置字符的宽度因子
        ///
        /// \param widthFactor 字符的宽度因子,widthFactor应为大于0的值
        /// \return true 表示成功, false 表示失败
        virtual bool SetWidthFactor(double widthFactor) = 0;

        /// \biref 设置默认的字符间距
        ///
        /// \param characterSpacing 字符间距
        /// \return ture表示设置成功，否则设置失败
        virtual bool SetCharacterSpacing(double characterSpacing) = 0;

        /// \brief 获取默认的字符间距
        ///
        /// 仅供RichText使用
        /// \return 默认的字符间距
        virtual double GetCharacterSpacing() const = 0;

        /// \breif 设置行间距系数
        ///
        /// 行间距是指上一行文字的顶部与下一行顶部之间的距离。
        /// 行间距系数是指行间距的一个倍数关系，如需要设置单倍行距时，其行间距系数为1.0。
        /// \param lineSpaceScale 待设置的行间距系数值
        /// \return true表示设置成功，否则设置失败
        virtual bool SetLineSpaceScale(double lineSpaceScale) = 0;

        /// \breif 获取行间距与字高的比例
        ///
        /// 该比例为行间距与该行字高最大值的比例
        /// \return 返回行间距与字高的比例
        virtual double GetLineSpaceScale() const = 0;


        /// \brief 设置acad样式字符串
        ///
        /// \param acadStyleString acad样式字符串
        /// \return ture表示设置成功，否则设置失败
        virtual bool SetAcadStyleString(const std::wstring& acadStyleString) = 0;

        /// \brief 获取acad样式字符串
        ///
        /// \return 返回acad样式字符串
        virtual std::wstring GetAcadStyleString() const = 0;


        /// \brief 设置文本内容
        ///
        /// \param text 文本内容
        /// \return ture表示设置成功，否则设置失败
        virtual bool SetText(const std::wstring& text) = 0;

        /// \brief 获取文本内容
        ///
        /// \return 返回文本内容
        virtual std::wstring GetText() const = 0;

        /// \brief 字体缺省是否加粗
        ///
        /// \return 返回字体是否加粗
        virtual bool IsBold() const = 0;

        /// \brief 设置是否加粗
        ///
        /// \param bold 加粗状态
        /// \return true表示设置成功，否则设置失败
        virtual bool SetBold(bool bold) = 0;

        /// \brief 字体斜体
        ///
        /// \param italic 斜体状态
        /// \return true表示设置成功，否则设置失败
        virtual bool SetItalic(bool italic) = 0;

        /// \brief 字体缺省是否斜体
        ///
        /// \return 返回字体是否斜体
        virtual bool IsItalic() const = 0;


        /// \brief 获取文字适配方式
        ///
        /// \return 返回文字适配方式
        virtual TextFitType GetTextFitType() const = 0;

        /// \brief 设置文字适配方式
        ///
        /// \param value 文字适配方式
        virtual void SetTextFitType(TextFitType value) = 0;


        /// \brief 设置字体文件名
        ///
        /// 目前字体文件需要放在运行程序目录下
        /// \param fontFileName 若RichText则应该设置字体文件名，若非RichText则应设置字体文件路径
        /// \return true表示设置成功，否则设置失败
        virtual bool SetFont(const std::wstring& fontFileName) = 0;

        /// \brief 获取默认的字体文件名
        ///
        /// \return 返回默认的文字字体
        virtual std::wstring GetFont() const = 0;


        /// \biref 设置水平对齐方式
        ///
        /// HorizontalAlignmentType::Scatter 分散对齐在文本自动换行的情况下情况下才有效果
        /// \param horizontalAlignment 水平对齐方式(默认向左对齐)
        /// \return ture表示设置成功，否则设置失败
        virtual bool SetHorizontalAlignmentType(gcmp::HorizontalAlignmentType horizontalAlignment) = 0;

        /// \brief 获取水平对齐方式
        ///
        /// 仅供RichText使用
        /// \return 返回水平对齐方式
        virtual gcmp::HorizontalAlignmentType GetHorizontalAlignmentType() const = 0;

        /// \biref 设置竖直对齐方式
        ///
        /// \param horizontalAlignment 竖直对齐方式(默认向上对齐)
        /// \return ture表示设置成功，否则设置失败
        virtual bool SetVerticalAlignmentType(gcmp::VerticalAlignmentType verticalAlignment) = 0;

        /// \brief 获取竖直对齐方式
        ///
        /// \return 返回竖直对齐方式
        virtual gcmp::VerticalAlignmentType GetVerticalAlignmentType() const = 0;


        /// \brief 设置水平定位类型
        ///
        /// \param horizontalAnchorPointType 水平定位类型（默认向左）
        /// \return true表示设置成功，否则设置失败
        virtual bool SetHorizontalAnchorPointType(gcmp::HorizontalAnchorPointType horizontalAnchorPointType) = 0;

        /// \brief 获取水平定位类型
        ///
        /// \return 返回水平定位类型
        virtual gcmp::HorizontalAnchorPointType GetHorizontalAnchorPointType() const = 0;

        /// \brief 设置竖直定位类型
        ///
        /// \param verticalAnchorPointType 竖直定位类型（默认向上）
        /// \return true表示设置成功，否则设置失败
        virtual bool SetVerticalAnchorPointType(gcmp::VerticalAnchorPointType verticalAnchorPointType) = 0;

        /// \brief 获取竖直定位类型
        ///
        /// 仅供RichText使用
        /// \return 返回竖直定位类型
        virtual gcmp::VerticalAnchorPointType GetVerticalAnchorPointType() const = 0;


        /// \brief 设置中西文字体(文件)名
        /// 
        /// 接口用来对中西文字符分别设置字体
        /// \param eFontName 西文字体名，默认为空 (字体文件名需带文件后缀，如simsun.ttc)
        /// \param cFontName 中文字体名，默认为空 (字体文件名需带文件后缀，如simsun.ttc)
        /// \return true 设置成功, false 设置失败
        virtual bool SetEnglishAndChineseFont(const std::wstring& enFont, const std::wstring& zhFont) = 0;

        /// \brief 获取中英文字体(文件)名
        /// 
        /// \return 返回中英文字体(文件)名，pair中first为西文字体名，second为中文字体名
        virtual std::pair<std::wstring, std::wstring> GetEnglishAndChineseFont() const = 0;


        /// \brief 获取是否在项目可见
        /// 
        /// \return 项目可见
        virtual bool IsVisibleInHostDocument() const = 0;

        /// \brief 设置是否在项目可见
        /// 
        /// \param   isVisibleInHostDocument 项目可见性
        /// \return 设置成功返回true，否则返回false
        virtual void SetVisibleInHostDocument(bool isVisibleInHostDocument) = 0;

        /// \brief 获取可见性标记
        /// 
        /// \return 可见性标记
        virtual const gcmp::IVisibilityTypeFlags* GetVisibilityTypeFlagsInHostDocument() const = 0;

        /// \brief 获取可见性标记
        /// 
        /// \return 可见性标记
        virtual gcmp::IVisibilityTypeFlags* GetVisibilityTypeFlagsInHostDocument() = 0;


        /// \brief 获取材质id
        /// 
        /// \return 材质id
        virtual gcmp::ElementId GetMaterialId() const = 0;

        /// \brief 设置材质id
        /// 
        /// \param   materialId 材质id
        virtual void SetMaterialId(const gcmp::ElementId& materialId) = 0;

        /// \brief 获取材质显示方式
        /// 
        /// \return 材质显示方式
        virtual gcmp::GraphicsMaterialDisplayStyle GetGraphicsMaterialDisplayStyle() const = 0;

        /// \brief 设置材质显示方式
        /// 
        /// \param displayStyle     材质显示方式
        /// \return 设置成功返回true，否则返回false
        virtual void SetGraphicsMaterialDisplayStyle(gcmp::GraphicsMaterialDisplayStyle displayStyle) = 0;

        /// \brief 获取子类别id
        /// 
        /// \return 子类别id
        virtual gcmp::UniIdentity GetSubCategoryId() const = 0;
        /// \brief 设置子类别id
        /// 
        /// \param subCategoryId    子类别id
        virtual void SetSubCategoryId(const gcmp::UniIdentity& subCategoryId) = 0;


        /// \brief 获取模型文字更新关联更新Id
        /// 
        /// \return 关联更新Id
        virtual RegenDataId GetNeedUpdateRdId() const = 0;

        /// \brief Mark模型文字关联更新Id
        /// 
        virtual void MarkNeedUpdateRdId() = 0;

        /// \brief 创建模型文字
        /// 
        /// \param pDocument  文档
        /// \param planeId    关联平面id
        /// \param option     创建选项
        /// \return 模型文字
        static IFamilyModelText* Create(gcmp::IDocument* pDocument, const gcmp::ElementId& planeId, gcmp::ElementCreationOptions option);



    };
}